package com.flowable.controller;

import org.flowable.engine.HistoryService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.variable.api.history.HistoricVariableInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.*;

@RestController
@RequestMapping("/api/approval-stats")
public class ApprovalStatisticsController2 {

    @Autowired
    private HistoryService historyService;

    /**
     * 获取今日已通过和已驳回的流程数量
     */
    @GetMapping("/today2")
    public Map<String, Integer> getTodayApprovalStats() {
        Map<String, Integer> stats = new HashMap<>();
        
        // 获取今天的开始和结束时间
        Date todayStart = getStartOfDay(new Date());
        Date todayEnd = getEndOfDay(new Date());

        System.err.println(todayStart);
        System.err.println(todayEnd);

        //错误原因是你混淆了 HistoricProcessInstanceQuery 和 HistoricTaskInstanceQuery 的用法。taskDefinitionKey() 和 taskCandidateGroup() 是 任务实例查询（HistoricTaskInstanceQuery） 的方法，不能直接用于 流程实例查询（HistoricProcessInstanceQuery）。
        // 统计今日已通过的流程数量
//        long approvedCount = historyService.createHistoricProcessInstanceQuery()
//                .finished() // 只统计已结束的流程
//                .startedAfter(todayStart) // 今天开始之后启动的
//                .finishedBefore(todayEnd) // 今天结束之前结束的
//                .variableValueEquals("approvalResult", "approved") // 审批结果为通过
//                .count();
        // 统计今日manager角色组在"managerApproval"节点审批通过的流程数量
//        long approvedCount = historyService.createHistoricTaskInstanceQuery()
//                // 1. 匹配领导审批节点（BPMN中的id="managerApproval"）
//                .taskDefinitionKey("managerApproval")
//                // 2. 匹配审批角色组（与BPMN中的flowable:candidateGroups="manager"一致）
//                .taskCandidateGroup("manager")
//                // 3. 审批时间在今天
//
//                .taskCompletedAfter(todayStart)
//                .taskCompletedBefore(todayEnd)
//                // 4. 审批结果为通过（任务级别的变量）
////                .taskVariableValueEquals("approvalResult", "approved")
//                // 5. 只统计已完成的任务
//                .finished()
//                .count();
        // 你的 LeaveService 中，领导审批时通过 taskService.complete(taskId, variables) 提交变量，Flowable 默认会将变量同时存储到任务实例和流程实例中。但如果后续流程中变量被覆盖或删除，可能导致任务实例级变量丢失。
        //因此，直接通过 HistoricTaskInstanceQuery 的 taskVariableValueEquals 可能查询不到结果，因为变量可能仅有效存储在流程实例中。

        // 通过任务查询获取符合条件的任务后，关联其所属的流程实例，再通过流程实例变量 approvalResult 筛选 “已通过” 的记录。


        // 先查询领导审批节点（managerApproval）今日完成的任务
        List<HistoricTaskInstance> managerTasks = historyService.createHistoricTaskInstanceQuery()
                .taskDefinitionKey("managerApproval") // 领导审批节点ID（需与BPMN文件一致）
                .taskCandidateGroup("manager") // 审批组（与BPMN一致）
                .taskCompletedAfter(todayStart)
                .taskCompletedBefore(todayEnd)
                .finished() // 已完成的任务
                .list();

        // 筛选出这些任务所属流程实例中，审批结果为"approved"的数量
        long approvedCount = managerTasks.stream()
                .map(HistoricTaskInstance::getProcessInstanceId) // 获取流程实例ID
                .distinct() // 去重（一个流程可能有多个任务，但只统计一次）
                .filter(processInstanceId -> {
                    // 查询流程实例级变量"approvalResult"
                    HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery()
                            .processInstanceId(processInstanceId)
                            .singleResult();
                    if (processInstance == null) {
                        return false;
                    }
                    // 获取流程实例变量（注意：变量需存在，否则返回null）
                    HistoricVariableInstance approvalResult = historyService.createHistoricVariableInstanceQuery()
                            .processInstanceId(processInstanceId)
                            .variableName("approvalResult")
                            .singleResult();


                    // 2. 处理变量不存在的情况
                    if (approvalResult == null) {
                        return false;
                    }
                    Object value = approvalResult.getValue();
                    return value != null && "approved".equals(value.toString());
                })
                .count();
        
        // 统计今日已驳回的流程数量
        long rejectedCount = historyService.createHistoricProcessInstanceQuery()
                .finished() // 只统计已结束的流程
                .startedAfter(todayStart)
                .finishedAfter(todayEnd)
                .variableValueEquals("approvalResult", "rejected") // 审批结果为驳回
                .count();
        
        stats.put("approvedCount", (int) approvedCount);
        stats.put("rejectedCount", (int) rejectedCount);
        System.err.println(stats);
        return stats;
    }
    
    /**
     * 获取一天的开始时间（00:00:00）
     */
    private Date getStartOfDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }
    
    /**
     * 获取一天的结束时间（23:59:59）
     */
    private Date getEndOfDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return calendar.getTime();
    }
}
    